const fs = require('fs');
const DataValidator = require('./data-validator');
const path = require('path'); // Added missing import for path

/**
 * 使用示例：验证websocket数据并生成有效数据数组
 */
async function main() {
    try {
        console.log('开始数据验证...\n');

        // 1. 读取原始数据文件
        const inputFile = './output/websocket_data_100_site.json';
        console.log(`正在读取数据文件: ${inputFile}`);

        if (!fs.existsSync(inputFile)) {
            throw new Error(`文件不存在: ${inputFile}`);
        }

        const rawData = JSON.parse(fs.readFileSync(inputFile, 'utf8'));
        console.log(`成功读取数据，共 ${Object.keys(rawData).length} 条记录\n`);

        // 2. 创建验证器实例
        const validator = new DataValidator();

        // 3. 执行数据验证
        console.log('正在验证数据...');
        const stats = validator.validateDataSet(rawData);

        // 4. 显示验证结果
        console.log('\n验证完成！');
        console.log('='.repeat(40));
        console.log(`总数据量: ${stats.total}`);
        console.log(`有效数据: ${stats.valid}`);
        console.log(`无效数据: ${stats.invalid}`);
        console.log(`有效率: ${((stats.valid / stats.total) * 100).toFixed(2)}%`);
        console.log('='.repeat(40));

        // 5. 获取验证后的数据
        const validData = validator.getValidData();
        const invalidData = validator.getInvalidData();

        // 6. 显示一些示例数据
        if (validData.length > 0) {
            console.log('\n有效数据示例（前3条）:');
            console.log(JSON.stringify(validData.slice(0, 3), null, 2));
        }

        if (invalidData.length > 0) {
            console.log('\n无效数据示例（前3条）:');
            console.log(JSON.stringify(invalidData.slice(0, 3), null, 2));
        }

        // 7. 生成完整报告和文件
        console.log('\n正在生成报告和文件...');
        validator.generateReport('./output');

        // 8. 手动保存有效数据（可选）
        const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
        const validDataFile = `./output/valid_data_array_${timestamp}.json`;

        // 保存为数组格式
        fs.writeFileSync(validDataFile, JSON.stringify(validData, null, 2), 'utf8');
        console.log(`\n有效数据数组已保存到: ${validDataFile}`);

        // 9. 显示最终结果
        console.log('\n✅ 数据验证和转换完成！');
        console.log(`📁 所有文件已保存到 output 目录`);
        console.log(`📊 有效数据格式: [{"location": "地点名称", ...}]`);

    } catch (error) {
        console.error('❌ 处理过程中出错:', error.message);
        process.exit(1);
    }
}

/**
 * 批量处理多个数据文件
 */
async function batchProcess() {
    const inputFiles = [
        './output/websocket_data_100_site.json',
        './output/websocket_data_200_npc.json',
        './output/websocket_data_area.json'
    ];

    console.log('开始批量处理数据文件...\n');

    for (const inputFile of inputFiles) {
        if (fs.existsSync(inputFile)) {
            try {
                console.log(`\n处理文件: ${inputFile}`);

                const rawData = JSON.parse(fs.readFileSync(inputFile, 'utf8'));
                const validator = new DataValidator();
                const stats = validator.validateDataSet(rawData);

                console.log(`  总数据: ${stats.total}, 有效: ${stats.valid}, 无效: ${stats.invalid}`);

                // 生成文件名
                const baseName = path.basename(inputFile, '.json');
                const timestamp = new Date().toISOString().replace(/[:.]/g, '-');

                // 保存有效数据
                const validDataFile = `./output/${baseName}_valid_${timestamp}.json`;
                validator.saveToFile(validDataFile, validator.getValidData(), 'json');

                // 保存CSV格式
                const csvFile = `./output/${baseName}_valid_${timestamp}.csv`;
                validator.saveToFile(csvFile, validator.getValidData(), 'csv');

            } catch (error) {
                console.error(`  处理文件 ${inputFile} 时出错:`, error.message);
            }
        } else {
            console.log(`文件不存在，跳过: ${inputFile}`);
        }
    }

    console.log('\n✅ 批量处理完成！');
}

// 如果直接运行此文件
if (require.main === module) {
    const args = process.argv.slice(2);

    if (args.includes('--batch')) {
        batchProcess();
    } else {
        main();
    }
}

module.exports = { main, batchProcess };
